package persistencia;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * Essa classe existe para a compactacao de arquivos para extensao .zip
 * Ela se tornou necessaria na criacao do sistema de logs, mais especificamente na classe GeradorDeLogs
 * @author Equipe Localisa, Usa Quem Precisa
 *
 */

public class Compactador {
	
	
	/**
	 * Metodo que retorna uma string com o conteudo do arquivo zipado passado como parametro
	 * @param nomeCompletoDoArquivo
	 * @return retorna uma string que representa o conteudo.
	 * @throws Exception excecoes relacionadas a abertura e uso de arquivos
	 */
	@SuppressWarnings("unchecked")
	public String mostraCoteudoDeZipados(String nomeCompletoDoArquivo) throws Exception{
		
			String nomeDoArquivo = nomeCompletoDoArquivo;
			String saida = "";
			ZipFile zip = new ZipFile(nomeDoArquivo);
			Enumeration e = zip.entries();
				
			while(e.hasMoreElements()){
				ZipEntry entrada = (ZipEntry) e.nextElement();
				if(entrada.isDirectory()){
					saida+=(entrada.getName()+" - Pasta\n");
				}else{
					saida+=(entrada.getName()+" - Arquivo\n");
				}
			}
			zip.close();
			return saida;
			
	}
	
	/**
	 * 
	 * @param nomeDoArquivoASerCriado, nome do arquivo que sera criado depois da compactacao
	 * @param arquivos, array com os nomes dos arquivos que serao compactados
	 * @throws Exception excecoes relacionadas a abertura e uso de arquivos 
	 */
	public void geraArquivoZipado(String nomeDoArquivoASerCriado, String[] arquivos) throws Exception{
	   
	   File arquivoGerado = new File(nomeDoArquivoASerCriado+".zip");
	   
	   ZipOutputStream streamDeSaida = new ZipOutputStream(new FileOutputStream(arquivoGerado));
	   
	   ZipEntry pontoDeEntrada; 
	   
	   byte[] tamanho = new byte[512];
	   
	   for(String arquivo : arquivos){
		  
		  File arquivoUsado = new File(arquivo); 
		   
		  FileInputStream arquivoAdicionado = new FileInputStream(arquivo);
		   
		  pontoDeEntrada = new ZipEntry(arquivoUsado.getName());
		  streamDeSaida.putNextEntry(pontoDeEntrada);
		  
		  	  
		  while((arquivoAdicionado.read(tamanho)) != -1){
			  streamDeSaida.write(tamanho, 0, tamanho.length);
		  }
		  
		  streamDeSaida.closeEntry();
	   }
	   
	   streamDeSaida.close();
	   
 
	   	   
   }


}
